object ScoreManagementSystem extends App {
  // 导入隐式转换以支持 padLeft 方法
  import scala.collection.mutable.StringBuilder

  // 定义科目列表
  val subjects = List("数学", "语文", "英语", "物理", "化学")

  // 生成测试数据：4个班级，每个班级30名学生
  case class Student(
                      id: String,
                      name: String,
                      className: String,
                      scores: List[Double]  // 顺序对应：数学、语文、英语、物理、化学
                    )

  // 生成随机成绩数据（50-100分）
  val random = new scala.util.Random
  val classes = List("一班", "二班", "三班", "四班")
  val students: List[Student] = for {
    cls <- classes
    studentNo <- 1 to 30
  } yield Student(
    // 使用 f 字符串格式化替代 padLeft，确保学号两位数
    id = f"${cls.head}${studentNo}%02d",
    name = s"学生${cls.head}${studentNo}",
    className = cls,
    scores = List.fill(5)(50 + random.nextDouble() * 50)
  )

  // 1. 计算每个学生的总分和平均分
  val studentsWithStats = for (s <- students) yield {
    val total = s.scores.sum
    val avg = total / s.scores.length
    (s, total, avg)
  }

  // 2. 按班级统计各分数段人数（总分）
  type ScoreRange = (String, Int, Int)  // (班级, 分数段标识, 人数)
  val scoreRanges = List(
    ("90+", 90, Int.MaxValue),
    ("80-89", 80, 89),
    ("70-79", 70, 79),
    ("60-69", 60, 69),
    ("60-", Int.MinValue, 59)
  )

  val classScoreDistribution: List[(String, Map[String, Int])] = for {
    cls <- classes
    val classStudents = studentsWithStats.filter(_._1.className == cls)
  } yield {
    val distribution = scoreRanges.map { case (rangeName, min, max) =>
      val count = classStudents.count { case (_, total, _) =>
        total >= min && total <= max
      }
      (rangeName, count)
    }.toMap
    (cls, distribution)
  }

  // 3. 筛选优秀学生（所有科目及格且平均分≥85）
  val excellentStudents = for {
    (student, _, avg) <- studentsWithStats
    if student.scores.forall(_ >= 60)  // 所有科目及格
    if avg >= 85                       // 平均分≥85
  } yield student

  // 4. 生成每个班级的各科平均分排名
  val classSubjectAvg: List[(String, List[(String, Double)])] = for {
    cls <- classes
    val classStudents = students.filter(_.className == cls)
  } yield {
    val subjectAvgs = for (i <- subjects.indices) yield {
      val avg = classStudents.map(_.scores(i)).sum / classStudents.length
      (subjects(i), avg)
    }
    // 按平均分降序排名
    (cls, subjectAvgs.toList.sortBy(-_._2))
  }

  // 5. 输出年级总分排名前10的学生
  val top10Students = studentsWithStats
    .sortBy(-_._2)  // 按总分降序排序
    .take(10)       // 取前10名

  // 打印结果
  println("======= 成绩管理系统结果 =======")

  // 示例输出前5名学生的总分和平均分
  println("\n1. 学生总分与平均分（前5名示例）：")
  studentsWithStats.take(5).foreach { case (s, total, avg) =>
    println(f"${s.id} ${s.name} ${s.className} 总分: $total%.1f 平均分: $avg%.1f")
  }

  // 输出班级分数段分布
  println("\n2. 班级分数段分布：")
  classScoreDistribution.foreach { case (cls, dist) =>
    println(s"$cls: ${dist.mkString(", ")}")
  }

  // 输出优秀学生
  println(s"\n3. 优秀学生（共${excellentStudents.length}人）：")
  excellentStudents.foreach { s =>
    println(s"${s.id} ${s.name} ${s.className} 各科成绩: ${s.scores.map(_.toInt).mkString(", ")}")
  }

  // 输出班级各科平均分排名
  println("\n4. 班级各科平均分排名：")
  classSubjectAvg.foreach { case (cls, avgs) =>
    println(s"$cls: ${avgs.map { case (sub, avg) => f"$sub: $avg%.1f" }.mkString(", ")}")
  }

  // 输出年级前10名
  println("\n5. 年级总分前10名：")
  top10Students.zipWithIndex.foreach { case ((s, total, avg), idx) =>
    println(f"第${idx+1}名: ${s.id} ${s.name} ${s.className} 总分: $total%.1f 平均分: $avg%.1f")
  }
}